package com.agile.leetcode.node.paritynode;

/**
 * 给定一个单链表，把所有的奇数节点和偶数节点分别排在一起。请注意，这里的奇数节点和偶数节点指的是节点编号的奇偶性，而不是节点的值的奇偶性。
 *
 * 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1)，时间复杂度应为 O(nodes)，nodes 为节点总数。
 *
 * 示例 1:
 *
 * 输入: 1->2->3->4->5->NULL
 * 输出: 1->3->5->2->4->NULL
 *
 * 示例 2:
 *
 * 输入: 2->1->3->5->6->4->7->NULL
 * 输出: 2->3->6->7->1->5->4->NULL
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/odd-even-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @Author KD
 * @Date 2021/2/1 13:52
 */
@SuppressWarnings("all")
public class SerialParity {
    public static void main(String[] args) {
        SerialParity parity = new SerialParity();
        ListNode node9 = new ListNode(9, null);
        ListNode node7 = new ListNode(7, node9);
        ListNode node5 = new ListNode(5, node7);
        ListNode node3 = new ListNode(3, node5);
        ListNode node1 = new ListNode(1, node3);
        ListNode listNode = parity.addEveny(node1);
        System.out.println(listNode);
    }

    public ListNode addEveny(ListNode head) {
        // 创建奇数dummy节点
        ListNode oddNumDummy = new ListNode(0, null);
        // 创建指针
        ListNode oddNumPtr = oddNumDummy;
        // 创建偶数dummy节点
        ListNode evenNumDummy = new ListNode(0, null);
        ListNode evenNumPtr = evenNumDummy;
        // 计数器
        int i = 1;
        // 遍历节点
        while (head != null) {
            if ((i & 1) == 1) {
                // 奇数
                oddNumPtr.next = head;
                oddNumPtr = oddNumPtr.next;
                head = head.next;
            } else {
                // 偶数
                evenNumPtr.next = head;
                evenNumPtr = evenNumPtr.next;
                head = head.next;
            }
            i++;
        }
        // 去除最后一个数的归属问题
        if ((i & 1) == 1) {
            oddNumPtr.next = null;
        } else {
            evenNumPtr.next = null;
        }
        ListNode next = evenNumDummy.next;
        // 连接节点
        oddNumPtr.next = next;
        return oddNumDummy.next;
    }
}

class ListNode {
    int value;
    ListNode next;

    public ListNode(int value, ListNode next) {
        this.value = value;
        this.next = next;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "value=" + value +
                ", next=" + next +
                '}';
    }
}
